package com.xnx.bincker.leader.utils;

import java.util.*;
import java.util.function.BiPredicate;
import java.util.function.Predicate;

public class ArraysUtils {
	/**
	 * 对两个数组进行去重操作
	 * @param first 第一个数组
	 * @param second 第二个数组
	 * @param comparator 比较器,返回-1则两个容器将保留该元素,返回0两个容器将删除改元素,返回1保留第一个容器的元素删除第二个容器的元素
	 * @return 返回一对新的数组，分别为过滤后的第一个数组数组和第二个数组
	 */
	public static <T> Pair<List<T>, List<T>> delDuplicate(Collection<T> first, Collection<T> second, Comparator<T> comparator){
		Pair<List<T>, List<T>> result = new Pair<>(new LinkedList<>(), new LinkedList<>(second));
		for (T t : first) {
			Iterator<T> iterator = result.getSecond().iterator();
			boolean flag = false;
			while (iterator.hasNext()){
				T t1 = iterator.next();
				int compareResult = comparator.compare(t, t1);
				if(compareResult > 0){
                    iterator.remove();
                }
				else if(compareResult == 0){
                    flag = true;
                    iterator.remove();
                }
			}
			if(!flag) result.getFirst().add(t);
		}
		return result;
	}

    /**
     * 取两个数组的交集
     * @param first 数组1
     * @param second 数组2
     * @param predicate 比较器
     */
	public static <T> Set<T> getIntersection(T[] first, T[] second, BiPredicate<T, T> predicate){
        Set<T> result = new HashSet<>();
        for (T t : first) {
            for (T t1 : second) {
                if(predicate.test(t, t1))
                    result.add(t);
            }
        }
        return result;
    }

    /**
     * 判断两个数组是否有交集
     * @param first 数组1
     * @param second 数组2
     * @param predicate 比较器
     */
    public static <T,S> boolean hasIntersection(T[] first, S[] second, BiPredicate<T, S> predicate){
	    for (T t : first) {
            for (S t1 : second) {
                if(predicate.test(t, t1))
                    return true;
            }
        }
	    return false;
    }

    /**
     * 创建Set集合
     * @param items 集合内容
     * @param <T> 集合泛型
     */
    @SafeVarargs
    public static <T> Set<T> asSet(T ...items) {
        return new HashSet<>(Arrays.asList(items));
    }
}
